Interface v Delphi
Otázka od: Marek Eichler
25. 9. 2002 12:30
Zdravim,
mel bych uvahu par dotazu k pouziti interface v Delphi a byl bych vdecny za
odpovedi a pripadne uvedeni na pravou miru:
Uvaha:
1. Pouziti interface neni vazano na pouziti technologie COM. Znamena to
tedy, ze pouzitim interface zarucuju objektu urcitou funkcnost
Otazky:
1. Kdyz pouzivam interface (bez COM) funguje pocitani referenci nebo ne ->
je treba se o to starat?
2. Objekt, ktery implementuje interface musi byt potomkem nejakeho
specialniho objektu, nebo je to naprosto jedno?
3. Pokud musi byt objekt implementujici interface potomkem urciteho objektu,
jak vyresit dedicnost?
S pozdravem Marek Eichler
Odpovedá: Ondrej Kelle
25. 9. 2002 13:07
> Uvaha:
> 1. Pouziti interface neni vazano na pouziti technologie COM.
Spravne.
> Otazky:
> 1. Kdyz pouzivam interface (bez COM) funguje pocitani
> referenci nebo ne -> je treba se o to starat?
Treba sa o to bud postarat, alebo to mozes zdedit od TInterfacedObject,
ktory sa o to stara.
> 2. Objekt, ktery implementuje interface musi byt potomkem nejakeho
> specialniho objektu, nebo je to naprosto jedno?
Musi byt akurat potomkom TObject, ako kazdy iny objekt.
HTH
TOndrej
Odpovedá: Radim Kunz
25. 9. 2002 13:00
----- Original Message -----
From: "Marek Eichler" <marek.eichler@seznam.cz>
To: "Konference Delphi" <delphi-l@clexpert.cz>
Sent: Wednesday, September 25, 2002 12:27 PM
Subject: Interface v Delphi
> Zdravim,
> mel bych uvahu par dotazu k pouziti interface v Delphi a byl bych vdecny
za
> odpovedi a pripadne uvedeni na pravou miru:
>
> Uvaha:
> 1. Pouziti interface neni vazano na pouziti technologie COM. Znamena to
> tedy, ze pouzitim interface zarucuju objektu urcitou funkcnost
>
> Otazky:
> 1. Kdyz pouzivam interface (bez COM) funguje pocitani referenci nebo ne ->
> je treba se o to starat?
Pocitani funguje vzdycky. Bohuzel.
>
> 2. Objekt, ktery implementuje interface musi byt potomkem nejakeho
> specialniho objektu, nebo je to naprosto jedno?
Muze byt potomkem TInterfacedObject, nebo nejakeho vlastniho, kde
jsou implementovany metody AddRef, Release a QueryInterface. Staci
se podivat na zdrojaky TInterfacedObject, neni to nic tezkeho.
>
> 3. Pokud musi byt objekt implementujici interface potomkem urciteho
objektu,
> jak vyresit dedicnost?
>
> S pozdravem Marek Eichler
>
Radim
Odpovedá: Martin Schayna
25. 9. 2002 12:48
----- Original Message -----
From: "Marek Eichler" <marek.eichler@seznam.cz>
> mel bych uvahu par dotazu k pouziti interface v Delphi a byl bych vdecny za
> odpovedi a pripadne uvedeni na pravou miru:
>
> Uvaha:
> 1. Pouziti interface neni vazano na pouziti technologie COM. Znamena to
> tedy, ze pouzitim interface zarucuju objektu urcitou funkcnost
Plati pravidlo, ze kazdy objekt ktery implementuje nejaky interface musi
zaroven implementovat zakladni interface IUnknown. Znamena to ze
musis bud podedit tridu od predka ktery jiz IUnknown implementuje
(TInterfacedObject) nebo IUnknown implementovat sam, neni to
nic tezkeho, jde hlavne o praci s ref.countem. Lze take premapovat
implementaci IUnknown v potomkovi TInterfacedObjectu tak ze se
znovu implementuje IUnknown, napr. kvuli zmene chovani pri pocitani
ref.countu -- napr. spolecny ref.count na vice objektech nebo jine
osetreni zanikani objektu pri spadnuti ref.countu na 0.
>
> Otazky:
> 1. Kdyz pouzivam interface (bez COM) funguje pocitani referenci nebo ne ->
> je treba se o to starat?
Korektni volani _AddRef a _Release na objektech drzenych pres interface
ti zajistuje kompilator Delphi. Osetreni techto metod musi resit objekt sam,
napr. musi vyvolat po spadnuti ref.countu na 0 pri _Release sam na sobe
Destroy. Zakladni implementace to jiz delaji (TInterfacedObject).
> 2. Objekt, ktery implementuje interface musi byt potomkem nejakeho
> specialniho objektu, nebo je to naprosto jedno?
nemusi, viz nahore
>
> 3. Pokud musi byt objekt implementujici interface potomkem urciteho objektu,
> jak vyresit dedicnost?
dtto.
Martin Schayna
Odpovedá: Milan Tomeš
25. 9. 2002 13:48
Ahoj Marku,
> Uvaha:
> 1. Pouziti interface neni vazano na pouziti technologie COM. Znamena to
> tedy, ze pouzitim interface zarucuju objektu urcitou funkcnost
>
> Otazky:
> 1. Kdyz pouzivam interface (bez COM) funguje pocitani referenci nebo ne ->
> je treba se o to starat?
Jestli bude pocitani referenci k dispozici se urcuje u implementace a ne v
interfacu. Resp. ono je k dispozici vzdy (metody AddRef a Release resp.
_AddRef a _Release v Delphi), protoze kazda implementace musi implementovat
rozhrani IUnknown (resp. od Delphi 6 rozhrani IInterface), ale interni
pochody se daji upravit tak, ze k pocitani odkazu vlastne nedochazi...
> 2. Objekt, ktery implementuje interface musi byt potomkem nejakeho
> specialniho objektu, nebo je to naprosto jedno?
V Delphi je objekt, ktery implementuje interface bezne potomkem
TInterfacedObject a v tomto predkovi je reference counting implementovan.
Ale obecne to muze byt jakykoliv objekt.
> 3. Pokud musi byt objekt implementujici interface potomkem
> urciteho objektu,
> jak vyresit dedicnost?
Jak "jak vyresit dedicnost" ??? Vzdyt ta je preci hlavnim rysem OOP.
Dedicnost je automaticky zarucena (ovsem pouze dedicnost trid nikoliv
dedicnost rozhrani...)
> S pozdravem Marek Eichler
S pozdravem
Milan Tomes
mailto:milan.tomes@haida.cz
Odpovedá: Marek Eichler
25. 9. 2002 13:27
Zdravim,
> >
> > 2. Objekt, ktery implementuje interface musi byt potomkem nejakeho
> > specialniho objektu, nebo je to naprosto jedno?
>
> Muze byt potomkem TInterfacedObject, nebo nejakeho vlastniho, kde
> jsou implementovany metody AddRef, Release a QueryInterface. Staci
> se podivat na zdrojaky TInterfacedObject, neni to nic tezkeho.
**** Co se stane, kdyz nebudu v predkovi implementovat AddRef, Release,
QueryInterface. Jde mi o to, ze delam editor zdrojovych kodu. Zatim mam pro
editor dve rozhrani s prikazy editoru a normalne to pouzivam bez AddRef, ...
a je to bez problemu.
>
> Radim
>
S pozdravem Marek Eichler
Odpovedá: Marek Eichler
25. 9. 2002 18:54
Zdravim
Milan Tomes:
> > jak vyresit dedicnost?
>
> Jak "jak vyresit dedicnost" ??? Vzdyt ta je preci hlavnim rysem OOP.
> Dedicnost je automaticky zarucena (ovsem pouze dedicnost trid nikoliv
> dedicnost rozhrani...)
*** "jak vyresit dedicnost" znamenalo, jak to udelat, kdyby objekt
implementujici interface musel byt dedeny od urciteho objektu a ne od toho,
ktery bych potreboval
> S pozdravem
>
> Milan Tomes
> mailto:milan.tomes@haida.cz
S pozdravem Marek Eichler
Odpovedá: Radim Kunz
25. 9. 2002 16:21
----- Original Message -----
From: "Marek Eichler" <marek.eichler@seznam.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, September 25, 2002 2:28 PM
Subject: Re: Interface v Delphi
> Zdravim,
>
>
> > >
> > > 2. Objekt, ktery implementuje interface musi byt potomkem nejakeho
> > > specialniho objektu, nebo je to naprosto jedno?
> >
> > Muze byt potomkem TInterfacedObject, nebo nejakeho vlastniho, kde
> > jsou implementovany metody AddRef, Release a QueryInterface. Staci
> > se podivat na zdrojaky TInterfacedObject, neni to nic tezkeho.
> **** Co se stane, kdyz nebudu v predkovi implementovat AddRef, Release,
> QueryInterface. Jde mi o to, ze delam editor zdrojovych kodu. Zatim mam
pro
> editor dve rozhrani s prikazy editoru a normalne to pouzivam bez AddRef,
...
> a je to bez problemu.
> >
> > Radim
> >
>
> S pozdravem Marek Eichler
>
Pokud nebudes mit v tride implementovane _AddRef, _Release a
QueryInterface, a budes chtit pouzivat rozhrani, tak to nezkompilujes
Pokud jsi to zkompiloval, pak je nejak implementovane mas.
Radim